﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using BusinessLogicLayer.Validation;
using Entities;
using Utilities;
using DataAccessLayer;
using System.Linq.Expressions;

namespace BusinessLogicLayer
{
    public class TaiKhoanManager : IValidation<TaiKhoan>
    {
        /// <summary>
        /// Biến _repository nhằm mục đích cung cấp các chức năng thêm, xóa, cập nhật và tìm kiếm, ...
        /// </summary>
        private readonly IRepository<TaiKhoan> _repository;

        /// <summary>
        /// Phương thức khởi tạo
        /// </summary>
        /// <param name="tk"></param>
        public TaiKhoanManager(IRepository<TaiKhoan> tk)
        {
            _repository = tk;
        }

        /// <summary>
        /// Kiểm tra tính hợp lệ của việc đăng nhập
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public ValidationResult Validate(TaiKhoan obj)
        {
            var result = new ValidationResult();
            string user_pattern = "^[a-z][a-z0-9]{4,20}$";
            if (!StringExtension.Test(obj.Username, user_pattern))
            {
                result.Messages.Add("Tên đăng nhập phải bắt đầu bằng ký tự \n Tên đăng nhập phải từ 4 - 20 ký tự bao gồm chử cái và số");
                return result;
            }
            if (string.IsNullOrEmpty(obj.Username.Trim()))
                result.Messages.Add("Tên đăng nhập phải khác rỗng");
            if (string.IsNullOrEmpty(obj.Password.Trim()))
                result.Messages.Add("Mật khẩu phải khác rỗng");
            return result;
        }

        /// <summary>
        /// Thêm hoặc cập nhật tài khoản
        /// </summary>
        /// <param name="tk"></param>
        /// <returns></returns>
        public ActionResult InsertOrUpdate(TaiKhoan tk)
        {
            var result = new ActionResult();
            try
            {
                if (!_repository.InsertOrUpdate(tk))
                    result.ex.Add(new Exception("Thêm tài khoản thất bại"));
            }
            catch(Exception ex) {
                result.ex.Add(ex);
            }
            return result;
        }

        /// <summary>
        /// Xóa tài khoản
        /// </summary>
        /// <param name="user"></param>
        /// <returns></returns>
        public ActionResult Delete(string user)
        {
            var result = new ActionResult();
            try
            {
                if (!_repository.Delete(tk => tk.Username == user))
                    result.ex.Add(new Exception("Xóa tài khoản thất bại"));
            }
            catch (Exception ex)
            {
                result.ex.Add(ex);
            }
            return result;
        }

        /// <summary>
        /// Tìm kiếm tài khoản
        /// </summary>
        /// <param name="tk"></param>
        /// <returns></returns>
        public ActionResultAsList<TaiKhoan> Find(Expression<Func<TaiKhoan, bool>> tk)
        {
            var result = new ActionResultAsList<TaiKhoan>();
            try{
                result.Result = _repository.Find(tk).ToList();
                if(result.Result.Count == 0)
                    result.ex.Add(new Exception("Không tìm thấy tài khoản"));
            }
            catch(Exception ex)
            {
                result.ex.Add(ex);
                
            }
            return result;
        }

    }
}
